package com.example.firstspringboot.controller;

import com.example.firstspringboot.bean.Student;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import java.util.ArrayList;
import java.util.List;

@Controller
public class HelloController {
    /**
     * <code>@RequestMapping(value = "路由映射", method = 接收方法)</code>
     * <p>method 可用属性值如下：</p>
     * <ul>
     *     <li><code>RequestMethod.GET</code> 只支持 Get 请求，主要用于查询操作</li>
     *     <li><code>RequestMethod.POST</code> 只支持 Post 请求，主要用于新建数据（提交数据）</li>
     *     <li><code>RequestMethod.PUT</code> 只支持 Put 请求，通常用于修改数据</li>
     *     <li><code>RequestMethod.DELETE</code> 只支持 Delete 请求，通常用于删除数据</li>
     *     <li>更多、更详细的 http 请求请参阅<a href="https://developer.mozilla.org/zh-CN/docs/web/http/methods">MDN</a></>
     * </ul>
     * <p>注解 @RequestMapping() 中不注明 method 属性，则任何请求均接受</p>
     * <p>若不写 method 属性，则可以省略 <code>value = </code> 这一前缀</p>
     * @param model 用于传递数据给页面
     * @return 返回 resources/static/templates/hello/index.html 文件页面
     */
    @RequestMapping(value = "/hello",method = RequestMethod.HEAD)
    public String index(Model model) {
        String name = "zwz";
        model.addAttribute("name", name);
        return "hello/index";
    }

    @RequestMapping("/test")
    public String test(Model model) {
        Student student = new Student(2021001, "zwz");
        model.addAttribute("student", student);
        return "hello/test";
    }

    /**
     * <p>注解 @RequestMapping 能将 Java 对象转为 json 格式数据返回给请求</p>
     * <p>如果不加该注解就返回 Java 对象，则会 Internal Server Error</p>
     * @return 以 json 返回所有注册了的学生信息
     */

    @RequestMapping("/students")
    @ResponseBody
    public List<Student> getAllStudents() {
        List<Student> list = new ArrayList<Student>();
        Student s1 = new Student(2020001, "小明");
        Student s2 = new Student(2020002, "小张");
        list.add(s1);
        list.add(s2);
        return list;
    }

    /**
     * <code>@PostMapping("/login") = RequestMapping(value="/login", method=RequestMethod.POST)</code>
     */
    @PostMapping("/login")
    @ResponseBody
    public Boolean login(String username, String password) {
        if ("zwz".equals(username) && "666".equals(password)) {
            return true;
        }
        return false;
    }

    /**
     * <p>在控制器中引用自定义配置</p>
     * <p>使用 @Value 注解给变量注入值：<code>@Value("${属性名}")</code></p>
     */
    @Value("${demo.app.description}")
    private String description;

    @RequestMapping("/description")
    @ResponseBody
    public String getDescription() {
        return description;
    }

}
